package com.itheima.service;

import com.itheima.RentSys;
import com.itheima.bean.Bus;
import com.itheima.bean.Car;
import com.itheima.bean.MotoVehicle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class RentServiceImp implements RentService {
    public static HashMap<String, HashMap<String, ArrayList<MotoVehicle>>> datas = RentSys.datas;
    Scanner sc = new Scanner(System.in);
    String type;// 键盘录入租车的类型(轿车 || 客车)

    @Override
    public void rentFlower() {
        //TODO 第四部分 : 完成租车业务逻辑
        System.out.println("请选择你要租车的类别:");
        System.out.println("当前有汽车类别:" + datas.keySet());

        // 死循环的目的 :
        // 1 当选择正确的选项 , 那么停止循环
        // 2 如果选择不是轿车或者客车 , 那么死循环直到录入正确为止
        while (true) {
            // 键盘录入的车的类型 : 轿车或者客车
            type = sc.nextLine();
            if (type.equals("轿车") || type.equals("客车")) {
                break;
            } else {
                System.out.println("请输入的选项不存在, 请重新输入....");
            }
        }
        /*
            1 如果代码执行到此位置 , 说明录入的车的类型已经存在
                在根据车的类型获取对应的Map集合
            2 获取的Map集合键存储的是品牌 , 值存储的是当前品牌下的所有的车
         */
        HashMap<String, ArrayList<MotoVehicle>> hm = datas.get(type);

        // 存储所有的当前类型车的所有品牌
        Set<String> brands = hm.keySet();
        System.out.println("您选择的" + type + "有如下的品牌:" + brands);

        // 判断键盘录入的品牌是否存在 , 不存在继续录入 , 存在停止死循环
        String brand;// 记录键盘录入的品牌
        while (true) {
            // 键盘录入选择当前车的品牌 : 例如 奔驰 , 大众
            brand = sc.nextLine();
            // 记录当前键盘录入的品牌是否存在
            //  true存在 , false不存在
            boolean flag = false;
            for (String setBrand : brands) {
                if (setBrand.equals(brand)) {
                    flag = true;
                }
            }
            if (flag) {
                // 存在,把死循环停掉
                break;
            } else {
                // 不存在, 给出提示 , 继续循环
                System.out.println("您录入的品牌不存在 , 请重新录入...");
            }
        }

        // 获取当前品牌对应的集合容器
        ArrayList<MotoVehicle> motoVehicles = hm.get(brand);

        // 判断此品牌的车是否还有剩余
        if (motoVehicles.isEmpty()) {
            System.out.println("抱歉,该品牌" + brand + "的车没有剩余!");
            return;// 结束当前方法
        } else {
            System.out.println("当前品牌下的车如下:");
            for (int i = 0; i < motoVehicles.size(); i++) {
                MotoVehicle motoVehicle = motoVehicles.get(i);
                // 用方法改进 , 显示当前车的信息
                showVehicles(motoVehicle, i);
            }
        }

        System.out.print("请输入您需要车型对应的序号:");
        String id = sc.nextLine();// 键盘录入当前车型的序号
        MotoVehicle motoVehicle = motoVehicles.get(Integer.parseInt(id));

        // 用方法改进 , 显示当前车的信息
        showVehicles(motoVehicle, 0);

        System.out.println("请输入您要租借的天数:");
        String day = sc.nextLine();

        // 调用calRent计算 , 此方法在机动车类(父类)中已有定义
        float money = motoVehicle.calRent(Integer.parseInt(day));

        System.out.println("尊敬的顾客,您此次租的车是" + brand + ",车牌为" +
                motoVehicle.getId() + "租借时间为" + day + "天,租金为" + money + "元,祝你把妹开心!");

        // 租借成功 , 应该把集合中的车移除
        RentSys.datas.get(type).get(brand).remove(motoVehicle);
        // 把租到的车存到已租到车的容器中
        RentSys.rentVehicles.add(motoVehicle);
    }

    @Override
    public void returnFlower() {
        //TODO 第五部分 : 完成还车业务逻辑
        // 获取已经租到车的容器
        ArrayList<MotoVehicle> rentVehicles = RentSys.rentVehicles;

        // 容器为空, 说明当前还没有租到车
        if (rentVehicles.isEmpty()) {
            System.out.println("您还没有进行租车,无法归还...");
            return;
        }

        // 代码走到此位置 , 已租到车
        System.out.println("当前已租到的车:");
        for (int i = 0; i < rentVehicles.size(); i++) {
            MotoVehicle motoVehicle = rentVehicles.get(i);
            // 展示已经租到的车
            showVehicles(motoVehicle, i);
        }

        System.out.println("请输入您要归还车的编号:");
        String rentId = sc.nextLine();

        while (true) {
            // 输入的编号,在集合索引范围之内 , 那么输入的编号存在
            // 举例 : 如果租到两辆车那么存储以租车的集合长度为2,索引是[0-1] , 对应的编号也是[0-1]
            if (Integer.parseInt(rentId) >= 0 && Integer.parseInt(rentId) < rentVehicles.size()) {
                break;
            } else {
                System.out.println("您输入编号不存在 , 请重新输入....");
            }
        }

        // 代码走到此位置 , 说明录入编号存在
        // 获取当前要归还的车
        MotoVehicle motoVehicle = rentVehicles.get(Integer.parseInt(rentId));
        // 获取归还车的品牌
        String brand = motoVehicle.getBrand();
        // 把归还的车添加到存储所有的车的容器
        RentSys.datas.get(type).get(brand).add(motoVehicle);
        // 已租到的车的容器进行删除此车
        RentSys.rentVehicles.remove(motoVehicle);
        System.out.println("归还成功!");
    }

    // 传入一辆车 , 展示此车的所有信息
    public void showVehicles(MotoVehicle motoVehicle, int index) {
        if (motoVehicle instanceof Car) {
            Car car = (Car) motoVehicle;
            System.out.println("[" + index + "]" + type + "信息如下:" + car.getBrand() + car.getType()
                    + ",车牌号为:" + car.getId() + ",租金每天:" + car.getRent() + "元");
        } else if (motoVehicle instanceof Bus) {
            Bus bus = (Bus) motoVehicle;
            System.out.println("[" + index + "]" + type + "信息如下:" + bus.getBrand() + ",座位为:" + bus.getSeats()
                    + ",车牌号为:" + bus.getId() + ",租金每天:" + bus.getRent() + "元");
        }
    }
}
